home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / info-service / www / src / midaswww-1.0 / midaslist.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-11-16  |  6.3 KB  |  275 lines

  1. #include <Mrm/MrmAppl.h>                        /* Motif Toolkit and MRM */
  2. #include "midaslist.h"
  3. #include "midasoperand.h"
  4.  
  5. XmString MidasCharToString();
  6.  
  7. static List MasterList = {0,0,0,0,0};
  8.  
  9. Boolean MidasConvertStringList(In,Out)
  10. MidasOperand *In;
  11. MidasOperand *Out;
  12. {
  13.     ListItem *item = MidasFindItemInList(&MasterList,In->Value.P);
  14.  
  15.     if (item == 0) Out->Value.P = (void *) MidasCreateEmptyList(In->Value.P);
  16.     else           Out->Value.P = item->Pointer;
  17.  
  18.     return TRUE;
  19. }    
  20. List *MidasCreateEmptyList(name)
  21.     char *name;
  22. {
  23.     ListItem *item;
  24.     List *list = XtNew(List);
  25.     *list = NullList;
  26.     item = MidasAddItemToList(&MasterList,name);
  27.     item->Pointer = list;
  28.     list->Name = item->Entry;
  29.     return list;
  30. }
  31. void MidasEmptyList(L)
  32.     List *L;
  33. {
  34.     ListItem *i, *next;
  35.     for (i = L->First; i != 0; i = next)
  36.       {
  37.         next = i->Next;
  38.         XtFree(i->Entry);
  39.         XtFree(i->Pointer);
  40.         XtFree((char *)i);
  41.       }
  42.  
  43.     L->First = 0;
  44.     L->Last  = 0;
  45.     L->Selected = 0;
  46.     if (L->W != 0) XmListDeleteAllItems(L->W);
  47. }
  48. ListItem *MidasFindItemInList(L,Entry)
  49.       List     *L;
  50.       char     *Entry;
  51. {
  52.     ListItem *i;
  53.  
  54.     for (i = L->First; i != 0; i = i->Next)
  55.         if (strcmp(i->Entry,Entry) == 0) return i; 
  56.  
  57.     return 0;
  58. }
  59. int MidasFindItemPosInList(L,Item)
  60.       List     *L;
  61.       ListItem *Item;
  62. {
  63.     ListItem *i;
  64.     int p = 1;
  65.  
  66.     for (i = L->First; i != 0; i = i->Next, p++)
  67.         if (i == Item) return p; 
  68.  
  69.     return 0;
  70. }
  71. ListItem *MidasFindItemInListPos(L,Pos)
  72.       List     *L;
  73.       int       Pos;
  74. {
  75.     ListItem *i;
  76.  
  77.     if (Pos == 0) return L->Last;
  78.     for (i = L->First; i != 0; i = i->Next) if (--Pos == 0) return i; 
  79.     return 0;
  80. }
  81. ListItem *MidasAddItemToListPos(L,Entry,position)
  82.       List     *L;
  83.       char     *Entry;
  84.       int       position;
  85. {
  86.     XmString string;
  87.     ListItem *i;
  88.     ListItem *new = XtNew(ListItem);
  89.  
  90.     new->Entry = XtNewString(Entry);
  91.     new->Pointer = 0; 
  92.  
  93.     if (L->W != 0) 
  94.       {
  95.         string = MidasCharToString(Entry);
  96.         XmListAddItem(L->W,string,position);
  97.         XmStringFree(string);
  98.       }
  99.     if (position == 0) i = 0;
  100.     else for (i = L->First; --position; i = i->Next);
  101.  
  102.     if (L->First == 0)
  103.       {
  104.         new->Next = 0;
  105.         new->Prev = 0;
  106.         L->Last = new;
  107.         L->First = new;
  108.       }
  109.     else if (i == 0 ) 
  110.       { 
  111.         new->Next = 0;
  112.         L->Last->Next = new;
  113.         new->Prev = L->Last;
  114.         L->Last = new;
  115.       }
  116.     else if (i == L->First)
  117.       {
  118.         new->Prev = 0;
  119.         L->First->Prev = new;      
  120.         new->Next = L->First;
  121.         L->First = new;
  122.       }
  123.     else
  124.       {
  125.         new->Next = i;
  126.         new->Prev = i->Prev;
  127.         i->Prev->Next = new;
  128.         i->Prev = new;
  129.       }
  130.  
  131.     return new;
  132. }
  133. ListItem *MidasAddItemToList(L,Entry)
  134.       List     *L;
  135.       char     *Entry;
  136. {
  137.     XmString string;
  138.     int position=1;
  139.     ListItem *i;
  140.  
  141.     for (i = L->First; i != 0; i = i->Next, position++)
  142.       {
  143.         int compare = strcmp(i->Entry,Entry);
  144.         if (compare >= 0) break; 
  145.       }
  146.     if (i==0) position=0;
  147.     return MidasAddItemToListPos(L,Entry,position);
  148. }
  149. void *MidasCopyList(Old,New,CopyRtn)
  150.     List *Old;
  151.     List *New;
  152.     XtPointer (*CopyRtn)();
  153. {
  154.     ListItem *iold, *inew;
  155.  
  156.     for (iold = Old->First; iold != 0; iold = iold->Next)
  157.       {
  158.         inew = MidasAddItemToListPos(New,iold->Entry,0);
  159.         inew->Pointer = CopyRtn(iold->Pointer);
  160.       }
  161. }
  162. void MidasRealizeList(L,W)
  163.       List     *L;
  164.       Widget    W;
  165. {
  166.     XmString list[4000];
  167.     ListItem *i;
  168.     int list_size=0;
  169.  
  170.     for (i = L->First;  i != 0; i = i->Next) 
  171.       list[list_size++] = MidasCharToString(i->Entry); 
  172.  
  173.     {
  174.       int n=0;
  175.       Arg args[10];
  176.       XtSetArg(args[n],XmNitemCount,list_size               ); n++;
  177.       XtSetArg(args[n],XmNselectedItemCount, (XtArgVal) 0   ); n++;
  178.       XtSetArg(args[n],XmNselectedItems,     NULL           ); n++;
  179.       XtSetArg(args[n],XmNitems,             (XtArgVal) list); n++;  
  180.       XtSetValues(W,args,n);
  181.     }
  182.     for (; list_size > 0; ) XmStringFree(list[--list_size]);
  183.  
  184.     L->Selected = 0;
  185.     L->W = W;
  186. }
  187. void MidasUnrealizeList(L)
  188.       List     *L;
  189. {
  190.     if (L->W != 0)
  191.       {
  192.         XmListDeleteAllItems(L->W);
  193.         L->Selected = 0;
  194.         L->W = 0;
  195.       }
  196. }
  197. void MidasRemoveItemFromList(L,item)
  198.       List     *L;
  199.       ListItem *item;
  200. {
  201.     int position=1;
  202.     ListItem *i;
  203.  
  204.     for (i = L->First; i != 0; i = i->Next, position++)
  205.         if (i == item) break; 
  206.  
  207.     if (i == 0) return;
  208.  
  209.     if (L->W != 0) XmListDeletePos(L->W,position);
  210.  
  211.     if (i->Next == 0) L->Last = i->Prev;
  212.     else              i->Next->Prev = i->Prev;
  213.     if (i->Prev == 0) L->First = i->Next;
  214.     else              i->Prev->Next = i->Next;
  215.  
  216.     if (i->Pointer != 0) XtFree(i->Pointer);
  217.     XtFree(i->Entry);
  218.     XtFree((char *)i);
  219. }
  220. void MidasSelectItemPosInList(L,Pos,Notify)
  221.       List     *L;
  222.       int      Pos;
  223.       Boolean  Notify;
  224. {
  225.   XmListSelectPos(L->W,Pos,Notify);
  226. }
  227. void MidasDestroyList(L)
  228.     List *L;
  229. {
  230.     ListItem *i;
  231.  
  232.     MidasEmptyList(L);
  233.     for (i = MasterList.First; i != 0; i = i->Next)
  234.       if (i->Pointer == L)
  235.         {
  236.           MidasRemoveItemFromList(&MasterList,i);
  237.           return;
  238.         }
  239. }
  240. static MidasOperand MidasFindNameInListPos(L,pos)
  241. List *L;
  242. int pos;
  243. {
  244.     MidasOperand Temp;
  245.     ListItem *item = MidasFindItemInListPos(L,pos);
  246.  
  247.     if   (item != NULL) Temp.Value.P = item->Entry; 
  248.     else                Temp.Value.P = "";
  249.     Temp.Dynamic = FALSE;
  250.     Temp.Type = MString;
  251.     return Temp;  
  252. }
  253. static MidasOperand MidasCreateList(name)
  254. char *name;
  255. {
  256.     MidasOperand Temp;
  257.  
  258.     Temp.Value.P = (XtPointer) MidasCreateEmptyList(name);
  259.     Temp.Dynamic = False; /* A lie...but what is one to do */
  260.     Temp.Type = "list";
  261.     return Temp;
  262. }
  263. MidasListInit()
  264. {
  265.  
  266.     MidasDeclareVerb("ADD LIST POSITION list name Int"      ,MidasAddItemToListPos);
  267.     MidasDeclareVerb("ADD LIST list name"                   ,MidasAddItemToList);
  268.     MidasDeclareVerb("REALIZE LIST list Widget"             ,MidasRealizeList);
  269.     MidasDeclareVerb("UNREALIZE LIST list"                  ,MidasUnrealizeList);
  270.     MidasDeclareVerb("EMPTY LIST list"                      ,MidasEmptyList);
  271.  
  272.     MidasDeclareFunction("LISTNAMEPOS(list,Int)"            ,MidasFindNameInListPos);
  273.     MidasDeclareFunction("CREATELIST(name)"                 ,MidasCreateList);
  274. }    
  275.